#include "dialog_can_config.h"
#include "ui_dialog_can_config.h"
#include <QCanBus>
#include <QCanBusDevice>

dialog_can_config::dialog_can_config(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::dialog_can_config)
{
    ui->setupUi(this);

    /* 插件类型项初始化 */
    pluginItemInit();

    /* 可用接口项初始化 */
    on_plugins_type_com_currentIndexChanged(ui->plugins_type_com->currentIndex());

    /* 比特率项初始化 */
    bitrateItemInit();
}

dialog_can_config::~dialog_can_config()
{
    delete ui;
}

/* 从系统中读取可用的插件，并显示到plugins_type_com */
void dialog_can_config::pluginItemInit()
{
    ui->plugins_type_com->addItems(QCanBus::instance()->plugins());
    for(int i=0;i<QCanBus::instance()->plugins().count();i++)
    {
        if(QCanBus::instance()->plugins().at(i) == "socketcan")
            ui->plugins_type_com->setCurrentIndex(i);
    }
}

/* 初始化一些常用的比特率，can的比特率不是随便设置的，有相应的计算公式 */
void dialog_can_config::bitrateItemInit()
{
    const QList<int> rates = {
        10000, 20000, 50000, 100000, 125000,
        250000, 500000, 800000, 1000000
    };

    for (int rate : rates)
        ui->baud_com->addItem(QString::number(rate), rate);

    /* 默认初始化以1000000比特率 */
    ui->baud_com->setCurrentIndex(8);
}

void dialog_can_config::on_plugins_type_com_currentIndexChanged(int index)
{
    (void)index;

    QList<QCanBusDeviceInfo> interfaces;
    ui->port_com->clear();
    /* 当我们改变插件时，我们同时需要将可用接口，从插件类型中读取出来 */
    interfaces = QCanBus::instance()
            ->availableDevices(ui->plugins_type_com->currentText());
    for (const QCanBusDeviceInfo &info : qAsConst(interfaces)) {
        ui->port_com->addItem(info.name());
    }
}

/* 确定所选配置 */
void dialog_can_config::on_confirm_btn_clicked()
{
    this->accept();
}

/* 设置CAN连接状态标签文本 */
void dialog_can_config::set_state_lab(const QString &state)
{
    ui->connect_state_edit->setText(state);
}

const QString dialog_can_config::get_plugins_type()
{
    return ui->plugins_type_com->currentText();
}

const QString dialog_can_config::get_port()
{
    return ui->port_com->currentText();
}

const QString dialog_can_config::get_baud()
{
    return ui->baud_com->currentText();
}
